﻿#ifndef FINGERPRINTREADER_H
#define FINGERPRINTREADER_H

#include <QObject>
#include <QThread>
#include <QImage>
#include <QString>

#include <windows.h>

namespace ZKFP
{
/**
 * @brief The FingerprintReader class 这个类完成指纹采集的工作。指纹判别工作由其他类来完成。
 */
class FingerprintReader : public QThread
{
    Q_OBJECT
public:
    explicit FingerprintReader(QObject *parent = nullptr);
    ~FingerprintReader();

    /**
     * @brief getDeviceCount 获取系统中识别出来的指纹识别器的数量
     * @return
     */
    int getDeviceCount();
    QImage acquireImage();
    QString vendorName() const;
    QString productName() const;
    QString serialNumber() const;
    uint16_t getVID() const;
    uint16_t getPID() const;
    bool isFakeFuncOn();
    QSize imageSize() {return QSize(m_image_width, m_image_height);}
signals:
    /**
     * @brief onFeatureInfo 取得指纹初始特征时发出该信号
     * @param quality 表示该指纹特征的质量
     *                0: 好的指纹特征, 1: 特征点不够, 2: 其它原因导致不能取到指纹特征, -1: 可疑
     */
    void onFeatureInfo(int quality);

    /**
     * @brief onFingerTouching 当手指按压纹取像设备时发送该信号。
     */
    void onFingerTouching();

    /**
     * @brief onFingerLeaving 当手离开压纹取像设备时发送该信号。
     */
    void onFingerLeaving();

    void onCapture(bool result);

    void onFingerprintReceived(QImage image, QByteArray fpTemplate);

    void fakeFinger();

public slots:
    bool openDevice(int index = 0);
    void closeDevice();
    void beginCapture();
    void cancelCapture();

    /**
     * @brief setFakeFunc 设置防假开关
     * @param on  true 表示开启防假指纹功能。 false 表示关闭防假指纹功能。
     */
    void setFakeFunc(bool on);


private:
    HANDLE m_handle;

    QString m_vendorName;
    QString m_productName;
    QString m_serialNumber;

    QImage m_fpImage;
    int m_image_width;
    int m_image_height;
    int m_image_size;
    int m_image_DPI;
    int m_isFakeOn;

    uint16_t m_vid;
    uint16_t m_pid;

    bool m_init;

    void run() override;
    bool isRealFinger();
    bool m_stop;

};

}


#endif // FINGERPRINTREADER_H
